package com.peng.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.peng.dto.UserRoleDTO;
import com.peng.entity.Role;
import com.peng.entity.User;
import com.peng.service.RoleService;
import com.peng.service.UserService;
import com.peng.utils.Result;
import com.peng.vo.query.RoleQueryVo;
import com.peng.vo.query.UserQueryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import org.springframework.stereotype.Controller;

import java.util.List;

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private RoleService roleService;


    /**
     * 查询所有用户信息（测试使用）
     *
     * @return
     */
    @GetMapping("/listAll")
    public Result listAll() {
        return Result.ok(userService.list());
    }


    // 分页查询用户列表
    @GetMapping("/list")
    public Result list(UserQueryVo userQueryVo) {
        // 创建分页信息
        IPage<User> page = new Page<>(userQueryVo.getPageNo(), userQueryVo.getPageSize());
        // 调用分页查询方法
        userService.findUserListByPage(page, userQueryVo);
        // 返回数据
        return Result.ok(page);
    }

    /**
     * 添加用户
     *
     * @param user
     * @return
     */
    @PreAuthorize("hasAuthority('sys:user:add')")
    @PostMapping("/add")
    public Result add(@RequestBody User user) {
        // 调用根据用户名查询用户信息的方法
        User item = userService.findUserByUserName(user.getUsername());
        // 判断对象是否为空，不为空则表示用户存在
        if (item != null) {
            return Result.error().message("该用户名已经被使用，请重新输入");
        }
        // 密码加密
        user.setPassword(passwordEncoder.encode(user.getPassword()));
//        调用保存用户信息的方法
        return userService.save(user) ? Result.ok().message("用户添加成功") : Result.error().message("用户添加失败");
    }

    /**
     * 修改用户
     *
     * @param user
     * @return
     */
    @PreAuthorize("hasAuthority('sys:user:edit')")
    @PutMapping("/update")
    public Result update(@RequestBody User user) {
        // 调用根据用户名查询用户信息的方法
        User item = userService.findUserByUserName(user.getUsername());
        // 判断对象是否为空，不为空则表示用户存在
        if (item != null && item.getId() != user.getId()) {
            return Result.error().message("登录名称已被占用");
        }
//        调用保存用户信息的方法
        return userService.updateById(user) ? Result.ok().message("用户修改成功") : Result.error().message("用户修改失败");
    }

    /**
     * 根据id删除用户
     *
     * @param id
     * @return
     */
    @PreAuthorize("hasAuthority('sys:user:delete')")
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Long id) {
        // 调用删除用户信息的方法
        return userService.deleteById(id) ? Result.ok().message("用户删除成功") : Result.error().message("用户删除失败");
    }

    /**
     * 获取分配角色列表
     *
     * @param queryVo
     * @return
     */
    @GetMapping("/getRoleListForAssign")
    public Result getRoleListForAssign(RoleQueryVo queryVo) {
        // 创建分页对象
        IPage<Role> page = new Page<>(queryVo.getPageNo(), queryVo.getPageSize());
        // 调用查询方法
        roleService.findRoleListByUserId(page, queryVo);
        // 返回数据
        return Result.ok(page);
    }

    /**
     * 根据用户ID查询该用户拥有的角色列表
     *
     * @param userId
     * @return
     */
    @GetMapping("/getRoleByUserId/{userId}")
    public Result getRoleByUserId(@PathVariable Long userId) {
        //调用根据用户ID查询该用户拥有的角色ID的方法
        List<Long> roleIds = roleService.findRoleIdByUserId(userId);
        return Result.ok(roleIds);
    }

    /**
     * 分配角色
     * @param roleDTO
     * @return
     */
    @PreAuthorize("hasAuthority('sys:user:edit')")
    @PostMapping("/saveUserRole")
    public Result saveUserRole(@RequestBody UserRoleDTO roleDTO){
        return userService.saveUserRole(roleDTO.getUserId(), roleDTO.getRoleIds())?Result.ok().message("角色分配成功"):Result.error().message("角色分配失败");
    }
}

